package com.itheima.controller;

import com.itheima.entity.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: dubbo-pro
 * @description:
 * @author: zhanghz001
 * @create: 2021-02-06 09:30
 **/
@RestController
@RequestMapping("/user")
public class ProviderController {
    // @Autowired
    @RequestMapping("/sayHello")
    public String sayHello() {
        return userService.sayHello();
    }
    
    /**
     * 做三个事情
     * 1:从zookeeper中获取到userService的url
     * 2:通过rpc进行远程调用
     * 3:将结果封装到一个代理对象中,给变量赋值
     */
    // @Reference  //远程注入
    
    // @Reference(timeout = 1000, retries = 2) //远程注入
    // @Reference(version = "v2.0") //远程注入
    //负载均衡策略(4种) : 
    // LeastActive: 最少活跃调用数,相同活跃数的随机。
    // @Reference(loadbalance = "leastactive") //远程注入
    // ConsistentHash:一 致性Hash,相同参数的请求总是发到同一提供者
    // @Reference(loadbalance = "consistenthash") //远程注入
    // Random:按权重随机，默认值。按权重设置随机概率。    
    // @Reference(loadbalance = "random") //远程注入
    // RoundRobin: 按权重轮询。
    // @Reference(loadbalance = "consistenthash")
    
    //集群容错
    //Failover Cluster:失败重试。默认值。当出现失败，重试其它服务器，默认重试2次，使 用retries配置。一般用于读操作 
    
    // @Reference(cluster = "failover")
    // Failfast Cluster :快速失败,发起-次调用，失败立即报错。通常用于写操作。
    // @Reference(cluster = "failfast")
    // Failsafe Cluster:失败安全，出现异常时，直接忽略。返回一个空结果。 
    // @Reference(cluster = "failsafe")
    // Failback Cluster:失败自动恢复,后台记录失败请求,定时重发。 
    // @Reference(cluster = "forking")
    // Forking Cluster :并行调用多个服务器，只要一个成功即返回。 
    // @Reference(cluster = "forking")
    // Broadcast Cluster: 广播调用所有提供者,逐个调用，任意一台报错则报错。
    // @Reference(cluster = "broadcast")
    
    //服务降级
    // 不会发起远程调用,直接返回null
    // @Reference(mock = "force:return null")
    //表示消费方对该服务的方法调用失败后,直接返回null,不抛异常
    @Reference(mock = "fail:return null")
    private UserService userService;
    
    /**
     * 根据id查询用户信息
     *
     * @param id
     * @return
     */
    
    @RequestMapping("/find")
    public User find(int id) {
        // Runnable runnable = new Runnable() {
        //     public void run() {
        //         for (int i = 1; i < 9; i++) {
        //             try {
        //                 Thread.sleep(1000);
        //             } catch (Exception e) {
        //                 e.printStackTrace();
        //             } finally {
        //                
        //             }
        //             System.out.println(i);
        //         }
        //     }
        // };
        // new Thread(runnable).start();
        return userService.findUserById(id);
    }
}
